﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Cookie_Hero.physics;
using Cookie_Hero.graphics;

namespace WindowsGame1.gamePlugins.renderer
{
    public class Physics
    {
        private List<PhysicsObject> objects;
        public Physics(ContentManager content)
        {
            objects = new List<PhysicsObject>();
        }

        /* Rendert alle objecten in de objectsx List 1 frame
         * @param gameTime: frametijd, geef deze door vanuit Game.Update(GameTime)
         * @param viewPort: width en height van de scene en dus de muren
         * @RETURN: alle gerenderde objecten
         */
        public List<PhysicsObject> renderframe(List<PhysicsObject> objects, GameTime gameTime, ImageSequenceController animations, GameDisplay.Viewport viewPort)
        {
            /* Alles tekenen en physics toevoegen
             * collision en zwaartekracht */
            for (int i = 0; i < objects.Count; i++)
            {
                PhysicsObject obj = objects[i];
                // als object een texture heeft EN visible is, dan physics
                if (PhysicsOperation.isVisual(obj))
                {
                    // basic physics
                    obj.speed.X *= obj.acceleration.X;
                    obj.speed.Y = (obj.speed.Y < 0) ? (obj.speed.Y * 0.95F) + 0.2F : obj.speed.Y * obj.acceleration.Y;
                    if (obj.speed.X > 4)
                    {
                        obj.speed.X = 4;
                    }
                    if (obj.speed.Y > 10)
                    {
                        obj.speed.Y = 10;
                    }
                    else if (obj.speed.Y < -6)
                    {
                        obj.speed.Y = -6;
                    }
                    obj.rotation += obj.rotationSpeed;
                    obj.rotation *= obj.rotationAcceleration;
                    obj.oldPosition = obj.position;
                    // framespeed, die lijkt mij zo het beste
                    obj.position += obj.speed * (float) gameTime.ElapsedGameTime.TotalSeconds * 200;

                    // zet dit bij events.laws
                    // als stick niet op de grond staat: val omlaag
                    

                    // bepaal of er tegen een muur is gebotst
                    Rectangle crash = Collisions.wallCollision(obj, animations, viewPort);
                    if (crash.Right > 1 || crash.Bottom > 1 || obj.position.Y > 400)
                    {
                        // Roep een wallcollision event aan
                        if (obj.name == "stick")
                        {
                            if (crash.Right > 1 || obj.position.X < 0)
                            {
                                obj.position.X = viewPort.width;
                                obj.speed.X = 0;
                            }

                            obj.speed.Y = 0;
                            obj.position.Y = 400;
                        }
                        //Console.WriteLine("Collision");
                    }
                    else
                    {
                        if (obj.name == "stick")
                        {
                            //obj.speed.Y += 0.2F;
                        }
                    }

                    // bepaal of er tegen een object is gebotst
                    List<String> collisions = Collisions.collisionRenderer(obj, animations, objects);
                    foreach (String collision in collisions)
                    {
                        // roep objectcollision events aan
                    }
                    
                }
            }
            this.objects = objects;
            return objects;
        }

        public PhysicsObject getObject(String name)
        {
            foreach (PhysicsObject obj in objects)
            {
                if (obj.name == name)
                {
                    return obj;
                }
            }
            return new PhysicsObject();
        }


        public List<PhysicsObject> getObjects(String name)
        {
            List<PhysicsObject> returnList = new List<PhysicsObject>();
            foreach (PhysicsObject obj in objects)
            {
                if (obj.name == name)
                {
                    returnList.Add(obj);
                }
            }
            return returnList;
        }



    }
}
